
///////////////////////////////////////////////////////////////////////////////
//
//  Copyright (c) 2009, Perry L Miller IV
//  All rights reserved.
//  BSD License: http://www.opensource.org/licenses/bsd-license.html
//
///////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////
//
//  Job class.
//
///////////////////////////////////////////////////////////////////////////////

#include "Usul/Config/Config.h"
#include "Usul/Jobs/Job.h"
#include "Usul/Atomic/Integer.h"

using namespace Usul::Jobs;


///////////////////////////////////////////////////////////////////////////////
//
//  Atomic counter for job ids. Do not start at zero because we 
//  use that to indicate an invalid id.
//
///////////////////////////////////////////////////////////////////////////////

namespace Helper
{
  typedef Usul::Atomic::Integer < Usul::Jobs::BaseJob::ID > ID;
  ID _nextId ( 1 );
  inline ID getNextId()
  {
    ID id ( _nextId );
    ++_nextId;
    return id;
  }
}


///////////////////////////////////////////////////////////////////////////////
//
//  Constructor
//
///////////////////////////////////////////////////////////////////////////////

BaseJob::BaseJob ( Priority p ) : BaseClass(),
  _handle ( p, Helper::getNextId() ),
  _cancelled ( false )
{
}


///////////////////////////////////////////////////////////////////////////////
//
//  Destructor
//
///////////////////////////////////////////////////////////////////////////////

BaseJob::~BaseJob()
{
}


///////////////////////////////////////////////////////////////////////////////
//
//  Return the job's id.
//
///////////////////////////////////////////////////////////////////////////////

BaseJob::ID BaseJob::id() const
{
  return _handle.id();
}


///////////////////////////////////////////////////////////////////////////////
//
//  Return the job's priority.
//
///////////////////////////////////////////////////////////////////////////////

BaseJob::Priority BaseJob::priority() const
{
  return _handle.priority();
}


///////////////////////////////////////////////////////////////////////////////
//
//  Return the job's handle.
//
///////////////////////////////////////////////////////////////////////////////

BaseJob::Handle BaseJob::handle() const
{
  return _handle;
}


///////////////////////////////////////////////////////////////////////////////
//
//  Overload to do real work.
//
///////////////////////////////////////////////////////////////////////////////

void BaseJob::execute()
{
}


///////////////////////////////////////////////////////////////////////////////
//
//  Cancel this job.
//
///////////////////////////////////////////////////////////////////////////////

void BaseJob::cancel()
{
  _cancelled = true;
}


///////////////////////////////////////////////////////////////////////////////
//
//  Are we cancelled?
//
///////////////////////////////////////////////////////////////////////////////

bool BaseJob::isCancelled() const
{
  return _cancelled;
}
